﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarvellousWorks.PracticalPatternNet8.Concept.Delegating;

/// <summary>
/// AsyncInvoker2 通过委托链的方式，依次执行多个字符串赋值操作。
/// 展示了 Action 委托的组合与调用方式。
/// </summary>
public class AsyncInvoker2
{
    // 备用：用于存储多个 Action 委托的列表（当前未使用）。
    // private IList<Action> handlers;

    // 用于存储结果字符串的数组。
    private string[] message = new string[3];

    // 委托链，依次执行多个字符串赋值操作。
    private Action handler;

    /// <summary>
    /// 构造函数，初始化委托链，将多个操作添加到 handler。
    /// </summary>
    public AsyncInvoker2()
    {
        // 传统写法：使用列表存储多个委托（已注释）。
        // handlers = new List<Action>();
        // handlers.Add(AppendHello);
        // handlers.Add(() => message[1] = ",");
        // handlers.Add(() => message[2] = "World");

        // 现代写法：直接将多个方法和匿名方法组合到 handler 委托链。
        handler += AppendHello; // 添加方法引用
        handler += () => message[1] = ","; // 添加匿名方法
        handler += () => message[2] = "World"; // 添加匿名方法
    }

    /// <summary>
    /// 执行委托链，依次完成字符串赋值操作。
    /// </summary>
    public void Invoke()
    {
        // 传统写法：遍历列表调用每个委托（已注释）。
        // foreach (var handler in handlers)
        // {
        //     handler();
        // }
        handler?.Invoke(); // 调用委托链
    }

    /// <summary>
    /// 索引器，获取 message 数组中指定索引的字符串。
    /// </summary>
    /// <param name="index">要获取的字符串索引。</param>
    /// <returns>对应索引的字符串。</returns>
    public string this[int index]
    {
        get => message[index];
    }

    /// <summary>
    /// 将 "Hello" 赋值到 message[0]。
    /// </summary>
    private void AppendHello()
    {
        message[0] = "Hello";
    }
}
